package com.ynding;

import java.applet.Applet;
import java.awt.*;

/**
 * <p> 礼炮 </p>
 *
 * @author ynding
 * @version 2021/4/14
 **/
public class FireWorks extends Applet implements Runnable {
    Dimension d;//定义一个Dimension对象
    //定义一个字体对象
    Font font = new Font("Helvetica", Font.BOLD, 36);
    FontMetrics fm;//定义一个字体矩阵
    Graphics goff;//定义一个Graphics对象
    Image ii;//定义一个Image对象
    Thread thethread;//定义一个线程
    String s;
    final int numrockets = 8;
    final int num = 16;
    int[] xcoord, ycoord, xspeed, yspeed;
    int[] count;
    boolean[] exploding;

    //获取小应用程序信息
    @Override
    public String getAppletInfo() {
        return ("Fireworks - By Ali");
    }

    //初始化
    @Override
    public void init() {
        Graphics g;
        int i;
        d = size();//获取小应用程序大小
        g = getGraphics();
        g.setFont(font);//设置字体
        fm = g.getFontMetrics();//获取字体矩阵
        xcoord = new int[numrockets * num];
        ycoord = new int[numrockets * num];
        xspeed = new int[numrockets * num];
        yspeed = new int[numrockets * num];
        count = new int[numrockets];
        exploding = new boolean[numrockets];
        for (i = 0; i < numrockets * num; i++) {
            xcoord[i] = -20000;
            ycoord[i] = -20000;
            xspeed[i] = 0;
            yspeed[i] = 0;
        }
        for (i = 0; i < numrockets; i++) {
            count[i] = 1 + i * 16;
            exploding[i] = true;
        }
        s = getParameter("Text");//获取所要显示的文字
    }

    //paint()方法
    @Override
    public void paint(Graphics g) {
        Graphics gg;
        if (goff == null && d.width > 0 && d.height > 0) {
            //创建一个可以使用的双缓冲图像
            ii = createImage(d.width, d.height);
            goff = ii.getGraphics();
            goff.setFont(font);
        }
        if (goff == null || ii == null) {
            return;
        }
        goff.setColor(Color.black);//设置颜色
        goff.fillRect(0, 0, d.width, d.height);//填充矩形
        FireWorks(goff);//调用FireWorks
        goff.setColor(new Color(128, 192, 255));//设置字体颜色
        //将文字画在屏幕上
        goff.drawString(s, (d.width - fm.stringWidth(s)) / 2, d.height / 2);
        g.drawImage(ii, 0, 0, this);
    }

    //FireWorks()方法
    public void FireWorks(Graphics g) {
        int i, j, index;
        int x, y, xspd, yspd;

        for (i = 0; i < numrockets; i++) {
            if (!exploding[i] && yspeed[i * num] > 0) { // 爆炸
                exploding[i] = true;
                for (j = 0; j < num; j++) {
                    index = i * num + j;
                    yspeed[index] = (int) ((Math.random() * 28.0)) - 15;
                    xspeed[index] = (int) ((Math.random() * 31.0)) - 16;
                    if (xspeed[index] >= 0) {
                        xspeed[index]++;
                    }
                }
            }
            for (j = 0; j < num; j++) {
                index = i * num + j;
                if (exploding[i]) {
                    switch (i & 3) {
                        case 0:
                            g.setColor(new Color(192, (count[i]) + 32, (count[i]) + 127));
                            break;
                        case 1:
                            g.setColor(new Color(count[i] + 32, 192, count[i] + 127));
                            break;
                        case 2:
                            g.setColor(new Color(192, 192, count[i] + 32));
                            break;
                        default:
                            g.setColor(new Color(count[i] + 32, count[i] + 127, 192));
                    }
                } else {
                    g.setColor(Color.white);
                }
                g.fillRect(xcoord[index] >> 3, ycoord[index] >> 3, 2, 2);
                xcoord[index] += xspeed[index];
                ycoord[index] += yspeed[index];
                yspeed[index]++;
            }
            count[i]--;
            if (count[i] <= 0) {
                count[i] = 128;
                exploding[i] = false;
                x = ((int) ((Math.random() * d.width))) << 3;
                y = d.height << 3;
                yspd = (int) ((Math.random() * 28)) - 58;
                xspd = (int) ((Math.random() * 15.0)) - 8;
                if (xspd >= 0) {
                    xspd++;
                }
                for (j = 0; j < num; j++) {
                    index = i * num + j;
                    xcoord[index] = x;
                    ycoord[index] = y;
                    xspeed[index] = xspd;
                    yspeed[index] = yspd;
                }
            }
        }
    }

    //run()方法
    public void run() {
        long starttime;
        Graphics g;
        //设置线程的优先权
        Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
        g = getGraphics();
        while (true) {
            //获取系统当前时间
            starttime = System.currentTimeMillis();
            try {
                paint(g);
                starttime += 30;
                //使线程进入睡眠状态
                Thread.sleep(Math.max(0, starttime - System.currentTimeMillis()));
            } catch (InterruptedException e)//抛出异常
            {
                break;
            }
        }
    }

    //启动线程
    @Override
    public void start() {
        if (thethread == null) {
            thethread = new Thread(this);
            thethread.start();
        }
    }

    //停止线程
    @Override
    public void stop() {
        if (thethread != null) {
            thethread.stop();
            thethread = null;
        }
    }
}

